package com.wsoft.system.job;

import cn.hutool.core.date.ChineseDate;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.wsoft.core.exception.Asserts;
import com.wsoft.core.utils.EmailUtil;
import com.wsoft.enums.TemplateTypeEnum;
import com.wsoft.system.entity.SysMemberEntity;
import com.wsoft.system.service.ISysMemberService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 节假日祝福 定时
 * @Author z001
 * @Date 2024/12/23 11:03
 */
@Slf4j
@Service
public class HolidayJob implements Job {

    @Resource
    private EmailUtil emailUtil;
    @Resource
    private ISysMemberService memberService;


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 获取当前日期
        LocalDate now = LocalDate.now();

        // 判断当前日期是否是节假日
        String holiday = getHoliday(now);

        // 如果是节假日，输出祝福语句
        if (holiday != null) {
            String greeting = getGreeting(holiday);
            List<SysMemberEntity> list = memberService.listAll();
            for (SysMemberEntity sysMemberEntity : list) {
                if(StrUtil.isNotBlank(sysMemberEntity.getEmail())){
                    emailUtil.sendEmail(sysMemberEntity.getEmail(),
                            "节假日祝福",
                            greeting,
                            TemplateTypeEnum.TEXT.getCode());
                }
            }
            Asserts.fail(greeting);
        }
    }


    /**
     * 判断当前日期是否是节假日
     *
     * @param date 当前日期
     * @return 节假日名称，如果不是节假日则返回 null
     */
    public static String getHoliday(LocalDate date) {
        int year = date.getYear();
        Map<String, LocalDate> holidays = new HashMap<>();

        // 公历节假日
        holidays.put("元旦", LocalDate.of(year, 1, 1));
        holidays.put("劳动节", LocalDate.of(year, 5, 1));
        holidays.put("国庆节", LocalDate.of(year, 10, 1));

        // 农历节假日
        holidays.put("春节", getSpringFestival(year));
        holidays.put("端午节", getDragonBoatFestival(year));
        holidays.put("中秋节", getMidAutumnFestival(year));

        // 判断当前日期是否是节假日
        for (Map.Entry<String, LocalDate> entry : holidays.entrySet()) {
            if (entry.getValue().equals(date)) {
                return entry.getKey();
            }
        }
        return null;
    }

    /**
     * 获取指定年份的春节日期
     *
     * @param year 公历年份
     * @return 春节日期（公历）
     */
    public static LocalDate getSpringFestival(int year) {
        // 农历正月初一
        ChineseDate chineseDate = new ChineseDate(year, 1, 1);
        return convertToLocalDate(chineseDate.getGregorianDate());
    }


    /**
     * 获取指定年份的端午节日期
     *
     * @param year 公历年份
     * @return 端午节日期（公历）
     */
    public static LocalDate getDragonBoatFestival(int year) {
        // 农历五月初五
        ChineseDate chineseDate = new ChineseDate(year, 5, 5);
        return convertToLocalDate(chineseDate.getGregorianDate());
    }

    /**
     * 获取指定年份的中秋节日期
     *
     * @param year 公历年份
     * @return 中秋节日期（公历）
     */
    public static LocalDate getMidAutumnFestival(int year) {
        // 农历八月十五
        ChineseDate chineseDate = new ChineseDate(year, 8, 15);
        return convertToLocalDate(chineseDate.getGregorianDate());
    }

    /**
     * 根据节假日名称生成祝福语句
     *
     * @param holiday 节假日名称
     * @return 祝福语句
     */
    public static String getGreeting(String holiday) {
        switch (holiday) {
            case "元旦":
                return "祝您元旦快乐，新年新气象！";
            case "春节":
                return "祝您春节快乐，阖家幸福，万事如意！";
            case "劳动节":
                return "祝您劳动节快乐，工作顺利，生活美满！";
            case "端午节":
                return "祝您端午节快乐，粽香四溢，幸福安康！";
            case "中秋节":
                return "祝您中秋节快乐，月圆人圆，幸福团圆！";
            case "国庆节":
                return "祝您国庆节快乐，祖国繁荣昌盛，生活幸福美满！";
            default:
                return "祝您节日快乐！";
        }
    }

    /**
     * 将 java.util.Date 转换为 java.time.LocalDate
     *
     * @param date 需要转换的日期（java.util.Date）
     * @return 转换后的日期（java.time.LocalDate）
     */
    public static LocalDate convertToLocalDate(Date date) {
        // 使用 DateUtil 工具类转换
        return DateUtil.toLocalDateTime(date).toLocalDate();
    }
}
